package designpattern.strategy.old;

/**
 * @author zhaoqiankun
 * @since 2021-12-27 0:41
 * 上述代码可以解决问题，但是从代码设计的⻆度还是存在⼀些问题
 * 增加或者修改打折⽅案时必须修改 BuyGoods 类源代码，违反了⾯向对象设计的 "开闭原
 * 则"，代码的灵活性和扩展性较差。
 * 打折⽅案代码聚合在⼀起，如果其他项⽬需要重⽤某个打折⽅案的代码，只能复制粘贴对应
 * 代码，⽆法以类组件的⽅式进⾏重⽤，代码的复⽤性差。
 * BuyGoods 类的 calculate() ⽅法随着优惠⽅案的增多会⾮常庞⼤，代码中会出现很多if分
 * ⽀，可维护性差。
 * 此时，我们可以使⽤策略模式对 BuyGoods 类进⾏重构，将打折⽅案逻辑（算法）的定义和使⽤
 * 分离。
 * 抽象策略类 AbstractDiscount，它是所有具体打折⽅案（算法）的⽗类，定义了⼀个 discount
 * 抽象⽅法
 */
public class Test {
    public static void main(String[] args) {
        BuyGoods buyGoods1 = new BuyGoods("Java编程思想", 99);
        buyGoods1.calculate("discount85");

        BuyGoods buyGoods2 = new BuyGoods("罗技鼠标", 66);
        buyGoods2.calculate("discount6");

        BuyGoods buyGoods3 = new BuyGoods("苹果笔记本", 15000.00);
        buyGoods3.calculate("discount5");

        BuyGoods buyGoods4 = new BuyGoods("佳能相机", 1900);
        buyGoods4.calculate(null);

    }
}
